关于C库函数的一些模拟实现以及讲解思考

您所在的位置:网站首页 函数find char 10a21是什么意思 关于C库函数的一些模拟实现以及讲解思考

关于C库函数的一些模拟实现以及讲解思考

2023-06-16 18:21| 来源: 网络整理| 查看: 265

文章目录 memcpy函数memcpy函数分析memcpy模拟实现 memmove函数memmove函数分析memmove模拟实现 strstr函数strstr函数分析strstr函数模拟实现 strlen函数函数分析strlen函数模拟实现 strcpy函数strcpy函数分析strcpy函数模拟实现 strcat函数strcat函数分析strcat函数模拟实现 strcmp函数strcmp函数分析strcmp函数模拟实现

memcpy函数 memcpy函数分析

首先这个函数的功能是用来进行内存拷贝的,仿照与strcpy,那么关于它的定义有如下解释

在这里插入图片描述 从图中可以看出,函数拥有三个参数,destination(目的地),source(来源于哪),num(需要几个字节),而函数的功能如下:Copies the values of num bytes from the location pointed to by source directly to the memory block pointed to by destination.

即将源头的内容拷贝到目的地中,拷贝num个字节

在这里回顾void*

void*是一个万能指针,它可以接收任意类型的指针,但相应的这是有代价的,你不能通过它直接取出里面的内容,需要将它强制转化为某种类型的指针,才能将它取出

而在这个函数中,由于我们不知道具体要拷贝什么类型的函数,于是我们就直接将这个指针类型设置为void*

那么有了上面的分析,模拟实现如下

memcpy模拟实现 //模拟实现memcpy #include #include void* my_memcpy(void* arr2, void* arr1, size_t size) { while (size--) { *(char*)arr2 = *(char*)arr1; (char*)arr2 = (char*)arr2 + 1; (char*)arr1 = (char*)arr1 + 1; } } int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9 }; int arr2[20] = { 0 }; //memcpy(arr2, arr1, 16); my_memcpy(arr2, arr1, 16); for (int i = 0; i void* ret = arr2; while (size--) { *(char*)arr2 = *(char*)arr1; (char*)arr2 = (char*)arr2 + 1; (char*)arr1 = (char*)arr1 + 1; } return ret; } int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9 }; int arr2[10] = { 0 }; //my_memmove(arr1+2, arr1, 16); my_memcpy(arr1 + 2, arr1, 16); for (int i = 0; i void* ret = dest; if (reso > dest) { while (size--) { *(char*)dest = *(char*)reso; (char*)dest = (char*)dest + 1; (char*)reso = (char*)reso + 1; } } else { while (size--) { *((char*)dest + size) = *((char*)reso + size); } } return ret; } void* my_memcpy(void* arr2, void* arr1, size_t size) { void* ret = arr2; while (size--) { *(char*)arr2 = *(char*)arr1; (char*)arr2 = (char*)arr2 + 1; (char*)arr1 = (char*)arr1 + 1; } return ret; } int main() { int arr1[10] = { 1,2,3,4,5,6,7,8,9 }; int arr2[10] = { 0 }; my_memmove(arr1+2, arr1, 16); //my_memcpy(arr1 + 2, arr1, 16); for (int i = 0; i char* s1 = (char*)str1; char* s2 = (char*)str2; char* cp = (char*)str2; while (*cp) { s1 = cp; s2 = (char*)str2; while (*s1 && *s2 && *s1 == *s2) { s1++; s2++; } if (*s2 == '\0') { return cp; } } return NULL; } int main() { char str1[] = { "abcde" }; char str2[] = { "bcd" }; printf("%s\n", my_strstr(str1, str2)); return 0; } strlen函数 函数分析

字符串函数中应用最广的函数之一,主要作用是寻找字符串中的\0,并记录在这之前有多少个字符,用来计算字符串的长度

strlen函数模拟实现

下面展示了三种strlen函数的模拟实现方式,指针,递归,和计数器

//strlen函数模拟 #include #include //计数器 size_t my_strlen1(const char* arrr) { int ret = 0; while (*arrr != '\0') { ret++; arrr++; } return ret; } //指针-指针 size_t my_strlen2(const char* arr) { int ret = 0; const char* p = arr; while (*arr != '\0') { arr++; } ret =(int)(arr - p); return ret; } //递归 size_t my_strlen3(const char* str) { if (*str == '\0') { return 0; } else { return 1 + my_strlen3(str + 1); } } int main() { char arr[] = "abcd"; int len1 = (int) my_strlen1(arr); int len2 = (int)my_strlen2(arr); int len3 = (int)my_strlen3(arr); printf("%d\n", len1); printf("%d\n", len2); printf("%d\n", len3); return 0; } strcpy函数 strcpy函数分析

strcpy函数又叫做字符串拷贝函数,运用场景通常是需要把一个字符串赋予给另外一个字符串时,由于语法限定不可以使用arr1=arr2这种语句用来赋值,于是诞生了字符串复制函数。

字符串函数通常都和\0有关,这个函数也不例外,这个函数的原理就是找到字符串中的\0并把它前面的内容复制到另外一个字符串中

strcpy函数模拟实现 //strcpy函数模拟 #include void my_strcpy1(char* arr2, const char* arr1) { do { *arr2 = *arr1; arr2++; arr1++; } while (*arr1 != '\0'); } char* my_strcpy2(char* str2, const char* str1) { char* ret = str1; while (*str2++ = *str1++); return ret; } int main() { char arr1[] = { "abcdef" }; char arr2[10] = { 0 }; char arr3[10] = { 0 }; my_strcpy1(arr2, arr1); my_strcpy2(arr3, arr1); printf("%s\n", arr1); printf("%s\n", arr2); printf("%s\n", arr3); printf("%s\n", my_strcpy2(arr3, arr1)); return 0; } strcat函数 strcat函数分析

strcat函数也叫做字符串追加函数,在指定的字符串后追加要追加的部分

strcat函数模拟实现 //strcat函数模拟 #include #include char* my_strcat(char* arr1, char* arr2) { char* ret = arr1; while (*arr1 != '\0') { arr1++; } while (*arr2 != '\0') { *arr1 = *arr2; arr2++; arr1++; } return ret; } int main() { char arr1[20] = "abcdef"; char arr2[] = "ghi"; printf("%s\n", my_strcat(arr1, arr2)); return 0; } strcmp函数 strcmp函数分析

这个函数也叫做字符串比较函数,给定两个字符串进行比较,比较的是字符串的ASCII码值,如果相等进行下一个,直到必出大小或遇到\0

如果A字符串大于B字符串,返回一个大于0的数,小于返回一个小于0的数,如果相等则返回0

strcmp函数模拟实现 //strcmp函数模拟 #include #include int my_strcmp(char* arr1, char* arr2) { int ret = 0; while (*arr1 != '\0' && *arr2 != '\0') { if (*arr1 > *arr2) { ret = 1; break; } else if (*arr1 arr1++; arr2++; } } return ret; } int main() { char arr1[] = { "abcde" }; char arr2[] = { "abcde\0fg" }; int len = my_strcmp(arr1, arr2); printf("%d", len); return 0; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3